#include <kernel/kernelhead.h>
#include <user/user.h>

void prime(int read_fd) {
    int mynum;
    if (read(read_fd, &mynum, sizeof(int)) <= 0) {
        exit(0);
    }
    printf("prime %d\n", mynum);

    int pd[2];
    pipe(pd);
    
    if (fork() == 0) { // 子进程
        close(pd[1]);  
        prime(pd[0]);  // 递归处理新管道
        exit(0);
    } else {           // 父进程
        close(pd[0]);  
        int num;
        while (read(read_fd, &num, sizeof(int)) > 0) {
            if (num % mynum != 0) {
                write(pd[1], &num, sizeof(int));
            }
        }
        close(read_fd);  
        close(pd[1]);    // 关闭子管道写入端，发送EOF
        wait(0);         // 等待子进程结束
    }
    exit(0);
}

int main() {
    int pd[2];
    pipe(pd);
    
    if (fork() == 0) { // 子进程
        close(pd[1]);  
        prime(pd[0]);
        exit(0);
    } else {           // 父进程
        close(pd[0]);  // 关闭主管道读取端
        for (int i = 2; i <= 35; i++) {
            write(pd[1], &i, sizeof(int));
        }
        close(pd[1]); // 关闭写入端，发送EOF
        wait(0);      // 等待子进程结束
    }
    exit(0);
}